﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WF_QLThuVien.BusinessLayer;
using WF_QLThuVien.Entities;
using WF_QLThuVien.BusinessLayer.DauSach;
using WF_QLThuVien.Entities.PhieuMuon;
using WF_QLThuVien.DataLayer.PhieuMuon;
using WF_QLThuVien.Utilities;
using WF_QLThuVien.BusinessLayer.PhieuMuon;
using WF_QLThuVien.Entities.QuyDinh;
using WF_QLThuVien.BusinessLayer.QuyDinh;
using System.Collections;

namespace WF_QLThuVien.PresentationLayer
{
    public partial class FormLapPhieuMuon : Form
    {
        #region: PANDA. Khai báo biến
        CDocGiaBLL GDocGiaBLL = new CDocGiaBLL();
        CBLL_DauSach GDauSachBLL = new CBLL_DauSach();
        CPhieuMuon GPhieuMuon;
        CCTPhieuMuon GCTPhieuMuon;
        CPhieuMuonBLL GPhieuMuonBLL = new CPhieuMuonBLL();
        CCTPhieuMuonBLL GCTPhieuMuonBLL = new CCTPhieuMuonBLL();
        List<CCTPhieuMuon> arrCTPM = new List<CCTPhieuMuon>();
        string GMaSach = "";
        //Delegate Load PHiếu Mượn(Refresh After Create)
        public delegate void UpdateDataPM();
        public event UpdateDataPM UpdateDataPM_Click;
        int GSoCTPM = 0;
        #endregion

        #region: Quy Định. PANDA
        CQuyDinh GQuyDinh;
        CBLL_QuyDinh GQuyDinhBLL = new CBLL_QuyDinh();
        #endregion

        #region: Đọc Giả. PANDA
        private ArrayList m_dataDocGia;
        int countSach = 0;
        #endregion

        public FormLapPhieuMuon()
        {
            InitializeComponent();
            GQuyDinh = GQuyDinhBLL.GetQuyDinh();
            m_dataDocGia = new ArrayList();
        }

        public FormLapPhieuMuon(ArrayList dataDocGia)
        {
            InitializeComponent();
            GQuyDinh = GQuyDinhBLL.GetQuyDinh();
            m_dataDocGia = dataDocGia;
        }

        private void btnHuy_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void FormLapPhieuMuon_Load(object sender, EventArgs e)
        {
            btnHuy.Enabled = true;
            btnThem.Enabled = false;
            btnLap.Enabled = false;
            btnXoa.Enabled = false;
            GPhieuMuon = new CPhieuMuon();
            GPhieuMuon.PhieuMuonID = CPhatSinhMa.MaPhieuMuon(DateTime.Now);
            labelPhieuMuon.Text = "Phiếu Số: " + GPhieuMuon.PhieuMuonID;
            txtMaSach.Enabled = false;
            countSach = 0;
        }

        private void lstCTPhieuMuon_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            btnXoa.Enabled = true;
        }

        #region: PANDA. Nút lệnh Thêm, Lập, Xóa, Hủy(viết rồi).
        private void btnThem_Click(object sender, EventArgs e)
        {
            try
            {
                if (GSoCTPM == 0)
                {
                    MessageBox.Show("Đọc Giả này không thể mượn thêm Sách");
                    txtMaSach.Text = "";
                    txtTenSach.Text = "";                    
                    return;
                }
                //Phiếu đã tạo khi Load Form
                #region: Kiềm Tra Nhập Sách
                if (txtMaDocGia.Text.Length == 0)
                {
                    MessageBox.Show("Vui lòng nhập mã đọc giả!");
                    return;
                }
                if (txtMaSach.Text.Length == 0 && txtTenDocGia.Text.Length == 0)
                {
                    MessageBox.Show("Nhập sai mã đọc giả!");
                    return;
                }
                if (txtMaSach.Text.Length == 0)
                {
                    MessageBox.Show("Vui lòng nhập mã Sách!");
                    return;
                }
                if (lstCTPhieuMuon.Items.Count == GQuyDinh.SoSachMuonToiDa) //Thêm Biến Quy Định Vào
                {
                    MessageBox.Show("Đã Thêm Quá Giới Hạn Sách Cho Phép!");
                    btnThem.Enabled = false;
                    return;
                }
                
                #endregion
                GPhieuMuon.DocGiaID = txtMaDocGia.Text;
                GPhieuMuon.NgayLap = dtpNgayLap.Value; //or DateTime.Now;
                GCTPhieuMuon = new CCTPhieuMuon();
                GCTPhieuMuon.PhieuMuonID = GPhieuMuon.PhieuMuonID;
                GCTPhieuMuon.SoLanGiaHan = 0;
                GCTPhieuMuon.TrangThai = "Dang muon";
                GCTPhieuMuon.NgayTra = DateTime.Now.AddDays(GQuyDinh.SoNgayMuonToiDa);
                GCTPhieuMuon.Sach = GDauSachBLL.timSachByMaSach(txtMaSach.Text);
                //Kiểm tra trạng thái đầu sách trước khi kiểm tra sách
                #region: Trạng thái đầu sách: Được Mượn Or Không
                string trangThaiDS = GDauSachBLL.timTrangThaiDauSach(GCTPhieuMuon.Sach.DauSachID.ToString());
                if (trangThaiDS.Equals(@"Khong duoc muon"))
                {
                    MessageBox.Show("Đầu Sách Này Không Được Phép Mượn");
                    return;
                }
                #endregion
                #region: Kiểm Tra Sách Trước Khi Mượn
                if (GCTPhieuMuon.Sach.TrangThai.ToString().Equals(@"Dang muon") || GCTPhieuMuon.Sach.TrangThai.ToString().Equals(@"Khong duoc muon") || GCTPhieuMuon.Sach.TrangThai.ToString().Equals(@"Mat") || GCTPhieuMuon.Sach.TrangThai.ToString().Equals(@"Hong"))
                {
                    MessageBox.Show("Không Thể Cho Mượn Cuốn Sách Này Vì Trạng Thái Là: " + GCTPhieuMuon.Sach.TrangThai.ToString());
                    return;
                }
                #endregion

                arrCTPM.Add(GCTPhieuMuon);
                string[] row = { GCTPhieuMuon.Sach.SachID.ToString(), txtTenSach.Text.ToString(), GCTPhieuMuon.Sach.TrangThai.ToString() };
                ListViewItem lvi = new ListViewItem(row);
                foreach (ListViewItem lvitmp in lstCTPhieuMuon.Items)
                {
                    if (lvi.SubItems[0].Text == lvitmp.SubItems[0].Text)
                    {
                        MessageBox.Show("Sách đã thêm rồi!");
                        return;
                    }
                }

                btnLap.Enabled = true;
                btnXoa.Enabled = true;
                GPhieuMuon.CtPhieuMuon.Add(GCTPhieuMuon);
                lstCTPhieuMuon.Items.Add(lvi);
                txtMaSach.Text = "";
                txtTenSach.Text = "";
                GSoCTPM--;
                
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("Nhập Sai Mã Sách");
            }
            
        }

        private void btnLap_Click(object sender, EventArgs e)
        {
            try
            {
                if (GPhieuMuonBLL.themPhieuMuon(GPhieuMuon))
                {
                    //Gọi hàm thêm CTPM xuống CSDL - Viết CTPMBLL nữa rồi gọi hàm - Phải có CTPMDAL trước
                    int i = 0;
                    foreach (CCTPhieuMuon ctpm in arrCTPM)
                    {
                        GDauSachBLL.UpdateTTSachDangMuon(ctpm.Sach.SachID.ToString()); //Cập nhật trạng thái sang "Dang muon"
                        GCTPhieuMuonBLL.themCTPhieuMuon(ctpm);
                        i++;
                    }
                    if (i == arrCTPM.Count)
                    {
                        MessageBox.Show("Thêm Chi Tiết Thành Công");
                        UpdateDataPM_Click();
                        this.Dispose();
                    }
                }
                else
                {
                    MessageBox.Show("Lập Không Thành Công - Vui Lòng Kiểm Tra Lại Sách Mượn!");
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void txtMaDocGia_Validated(object sender, EventArgs e)
        {
            string maDocGia = txtMaDocGia.Text;
            CDocGia dg = GDocGiaBLL.timMaDocGia(maDocGia);
            //MessageBox.Show(dg.TenDocGia);
            txtTenDocGia.Text = dg.TenDocGia;
        }

        private void txtMaSach_Validated(object sender, EventArgs e)
        {
            string maSach = txtMaSach.Text;
            string tenSach = GDauSachBLL.timTenSachByMaSach(maSach);
            txtTenSach.Text = tenSach;
        }
        #endregion

        private void btnXoa_Click(object sender, EventArgs e)
        {
            arrCTPM.Clear();
            txtTenSach.Text = "";
            txtMaSach.Text = "";
            txtTenDocGia.Text = "";
            txtMaDocGia.Text = "";
            lstCTPhieuMuon.Items.Clear();
            btnLap.Enabled = false;
            /*if (GMaSach == "")
            {
                return;
            }
            if (GIndex == -1)
            {
                return;
            }
            
            //Viết sự kiện click trên ListView, lấy ra mã sách, remove trong arrCTPM + Xóa trong View
            foreach (CCTPhieuMuon ctpm in arrCTPM)
            {
                if (ctpm.Sach.SachID.ToString().Equals(GMaSach))
                {
                    arrCTPM.Remove(ctpm);
                    break;
                }
            }

            if (arrCTPM.Count == 0)
            {
                btnLap.Enabled = false;
            }*/
        }

        private void txtTenDocGia_TextChanged(object sender, EventArgs e)
        {
            txtMaSach.Enabled = true;
        }

        private void btnCheck_Click(object sender, EventArgs e)
        {
            
            string maDocGia = txtMaDocGia.Text;
            #region: Kiểm Tra Tiền Ký Quỹ
            CDocGia tmp = GDocGiaBLL.timMaDocGia(maDocGia);
            if (tmp.KyQuy < GQuyDinh.TienKyQuyToiThieu)
            {
                MessageBox.Show("Đọc Giả này ký quỹ chưa đúng quy định!");
                return;
            }
            #endregion
            #region: Kiểm Tra Trạng Thái Đọc Giả - Đã Nghĩ Hay Còn Học
            if (tmp.TinhTrang.ToString().Equals(@"Da nghi"))
            {
                MessageBox.Show("Đọc Giả này đã Nghĩ Học!! Không Thể Cho Mượn Sách");
                return;
            }
            #endregion
            //Kiểm tra số chi tiết phiếu mượn có trạng thái là đang mượn
            
            #region: Đếm Số Phiếu Của Đọc Giả qua mã đọc giả
            foreach (CDocGia dg in m_dataDocGia)
            {
                countSach = 0;
                if (dg.DocGiaID.ToString().Equals(maDocGia))
                {
                    
                    foreach (CPhieuMuon pm in dg.DsPhieuMuon)
                    {
                        foreach(CCTPhieuMuon ctpm in pm.CtPhieuMuon)
                        {
                            if (ctpm.TrangThai.ToString().Equals(@"Dang muon"))
                            {
                                countSach++;
                            }
                        }
                        if (countSach >= GQuyDinh.SoSachMuonToiDa)
                        {
                            MessageBox.Show("Đọc Giả này đã mượn tối đa sách quy định!");
                            btnThem.Enabled = false;
                            txtMaDocGia.Text = "";
                            txtTenDocGia.Text = "";
                            countSach = 0;
                            return;
                        }
                    }
                }
            }
            #endregion
            if (txtTenDocGia.Text.Length != 0)
            {
                txtMaSach.Enabled = true;
                btnThem.Enabled = true;
                GSoCTPM = GQuyDinh.SoSachMuonToiDa - GCTPhieuMuonBLL.TimSoCTPMByMaDocGia(txtMaDocGia.Text);
            }
            else
            {
                MessageBox.Show("Nhập sai mã đọc giả");
            }
        }

        private void lstCTPhieuMuon_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnXoa.Enabled = true;
            if (lstCTPhieuMuon.Items.Count <= 0)
            {
                return;
            }
            else
            {
                foreach (ListViewItem lvi in lstCTPhieuMuon.SelectedItems)
                {
                    GMaSach = lvi.SubItems[0].Text;
                    break;
                }
            }
        }

        private void lstCTPhieuMuon_Validated(object sender, EventArgs e)
        {
            if (lstCTPhieuMuon.Items.Count > 0)
            {
                btnXoa.Enabled = true;
                if (lstCTPhieuMuon.Items.Count == 0)
                {
                    btnLap.Enabled = false;
                }
            }
        }

    }
}
